home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2002 #11 / Amiga Plus CD - 2002 - No. 11.iso / Tools / Development / PowerD / Dmod / dmod_Warp3D / examples / w3d_cube_cgx.d < prev    next >
Encoding:
Text File  |  2002-10-28  |  6.8 KB  |  269 lines

  1. // cube example CGFX+P96
  2.  
  3. MODULE    'intuition/intuition',
  4.             'intuition/screens',
  5.             'utility/tagitem',
  6.             'graphics/modeid',
  7.             'graphics/view',
  8.             'exec/memory'
  9.  
  10. MODULE    'warp3d',
  11.             'warp3d/warp3d'
  12. MODULE    'libraries/cybergraphics',
  13.             'cybergraphics'
  14.  
  15. PROC Go()
  16.     // build all needed vertexes
  17.     DEF    v[8]:W3D_Vertex,n
  18.     DEF    p=[    // cube vertex and colour definition
  19.         -1,-1,-1,    0,0,0,
  20.         +1,-1,-1,    0,0,1,
  21.         +1,-1,+1,    0,1,0,
  22.         -1,-1,+1,    0,1,1,
  23.         -1,+1,-1,    1,0,0,
  24.         +1,+1,-1,    1,0,1,
  25.         +1,+1,+1,    1,1,1,
  26.         -1,+1,+1,    1,1,0]:vertex
  27.     DEF    sqr=[    // squares definition of points ids
  28.         0,3,7,4,        // left
  29.         1,2,6,5,        // right
  30.         0,1,5,4,        // back
  31.         2,3,7,6,        // front
  32.         0,1,2,3,        // bottom
  33.         4,5,6,7]:W    // top
  34.  
  35.     // setup all the vertex colours
  36.     FOR n:=0 TO 7
  37.         v[n].w:=0.0
  38.         v[n].u:=0.0
  39.         v[n].v:=0.0
  40.         v[n].tex3d:=0
  41.         v[n].color.a:=1.0
  42.         v[n].color.r:=p[n].r
  43.         v[n].color.g:=p[n].g
  44.         v[n].color.b:=p[n].b
  45.         v[n].spec.r:=1.0
  46.         v[n].spec.g:=1.0
  47.         v[n].spec.b:=1.0
  48.         v[n].l:=0
  49.     ENDFOR
  50.  
  51.     // setup the trifan for the above vertexes
  52.     DEF    trifan:W3D_TrianglesV
  53.     trifan.vertexcount:=4
  54.     trifan.v:=[NIL,NIL,NIL,NIL,NIL]:UL    // prepare the field
  55.     trifan.tex:=NIL
  56.     trifan.st_pattern:=NIL
  57.  
  58.     DEF    msg:PTR TO IntuiMessage,class,next=TRUE
  59.     DEF    angles=[0,0,0,0,0,0]:vertex,ver:PTR TO PTR TO W3D_Vertex
  60.     WHILE next
  61.         IF msg:=GetMsg(window.UserPort)
  62.             SELECT class:=msg.Class
  63.             CASE IDCMP_MOUSEMOVE
  64.                 angles.x:=msg.MouseY/100
  65.                 angles.y:=msg.MouseX/100
  66.             DEFAULT
  67.                 next:=FALSE
  68.             ENDSELECT
  69.             ReplyMsg(msg)
  70.         ENDIF
  71.  
  72.         FOR n:=0 TO 7 Compute3DPoint(v[n],p[n],angles)
  73.  
  74.         // lock hardware to allow to use it
  75.         IF W3D_SUCCESS=W3D_LockHardware(context)
  76.             W3D_ClearDrawRegion(context,0)
  77.             W3D_ClearZBuffer(context,NIL)
  78.             FOR n:=0 TO 5
  79. /*
  80.                 pay attention. this is buggy stuff in PowerD!!!!!
  81.  
  82.                 trifan.v[0]:=v[sqr[n*4+0]]
  83.                 trifan.v[1]:=v[sqr[n*4+1]]
  84.                 trifan.v[2]:=v[sqr[n*4+2]]
  85.                 trifan.v[3]:=v[sqr[n*4+3]]
  86. */
  87.                 ver:=trifan.v
  88.                 ver[0]:=v[sqr[n*4+0]]
  89.                 ver[1]:=v[sqr[n*4+1]]
  90.                 ver[2]:=v[sqr[n*4+2]]
  91.                 ver[3]:=v[sqr[n*4+3]]
  92.                 W3D_DrawTriFanV(context,trifan)
  93.             ENDFOR
  94.             W3D_UnLockHardware(context)
  95.         ELSE Raise("LHW")
  96.  
  97.         // swap the buffers
  98.         SwitchBuffers()
  99.     ENDWHILE
  100. ENDPROC
  101.  
  102. PROC Compute3DPoint(pixel:PTR TO W3D_Vertex,vertex:PTR TO vertex,angles:PTR TO vertex)
  103.     DEFD    x,y,z,xx,yy,zz,x1,y1,z1,lminuszz
  104.     x:=vertex.x
  105.     y:=vertex.y
  106.     z:=vertex.z
  107.  
  108.     x1:=x*Cos(angles.z)+y*Sin(angles.z)
  109.     y1:=y*Cos(angles.z)-x*Sin(angles.z)
  110.     xx:=x1*Cos(angles.y)+z*Sin(angles.y)
  111.     z1:=z*Cos(angles.y)-x1*Sin(angles.y)
  112.     zz:=z1*Cos(angles.x)+y1*Sin(angles.x)
  113.     yy:=y1*Cos(angles.x)-z1*Sin(angles.x)
  114.  
  115.     lminuszz:=5-zz
  116.     IF lminuszz>0.0
  117.         x:=xx*5/lminuszz
  118.         y:=-yy*5/lminuszz
  119.     ELSE RETURN
  120.     x*=height/4
  121.     y*=height/4
  122.     x+=width/2
  123.     y+=height/2
  124.     pixel.x:=x
  125.     pixel.y:=y
  126.     pixel.z:=(zz+2)/4
  127. ENDPROC
  128.  
  129. PROC SwitchBuffers()
  130.     IFN bufnum
  131.         bm:=buf2.BitMap
  132.         W3D_SetDrawRegion(context,bm,0,scissor)
  133.         buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  134.         WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  135.         WaitTOF()
  136.         bufnum:=1
  137.     ELSE
  138.         bm:=buf1.BitMap
  139.         W3D_SetDrawRegion(context,bm,0,scissor)
  140.         buf2.DBufInfo.SafeMessage.ReplyPort:=NIL
  141.         WHILEN ChangeScreenBuffer(screen,buf2);    ENDWHILE
  142.         WaitTOF()
  143.         bufnum:=0
  144.     ENDIF
  145. ENDPROC
  146.  
  147. OBJECT vertex
  148.     x/y/z:F,
  149.     r/g/b:F
  150.  
  151. DEF    Warp3DBase,CyberGfxBase
  152.  
  153. DEF    screen:PTR TO Screen,window:PTR TO Window,context:PTR TO W3D_Context,scissor:PTR TO W3D_Scissor,
  154.         width,height,buf1:PTR TO ScreenBuffer,buf2:PTR TO ScreenBuffer,bm:PTR TO BitMap,bufnum
  155.  
  156. PROC main()
  157.     OpenAll()
  158.     Go()
  159. EXCEPTDO
  160.     CloseAll()
  161.     DEF    err,err2=NIL
  162.     SELECT exception
  163.     CASE "CGX";    err:='unable to open cybergraphics.library'
  164.     CASE "W3D";    err:='unable to open warp3d.library'
  165.     CASE "DRV";    err:='unsuitable 3d driver'
  166.     CASE "N15";    err:='15 bit buffer unsupported'
  167.     CASE "MID";    err:='invalid screen mode'
  168.     CASE "SCR";    err:='unable to open screen'
  169.     CASE "SCB";    err:='unable to get screen buffer'
  170.     CASE "CGB";    err:='no cybergraphics bitmap: screen buffer '
  171.         err2:=["0"+exceptioninfo,0]:CHAR
  172.     CASE "WIN";    err:='unable to open window'
  173.     CASE "CTX";    err:='unable to build context: '
  174.         SELECT exceptioninfo
  175.         CASE W3D_ILLEGALINPUT;    err2:='illegal input'
  176.         CASE W3D_NOMEMORY;        err2:='no memory'
  177.         CASE W3D_NODRIVER;        err2:='no driver'
  178.         CASE W3D_UNSUPPORTEDFMT;err2:='unsupported format'
  179.         CASE W3D_ILLEGALBITMAP;    err2:='illegal bitmap'
  180.         ENDSELECT
  181.     CASE "LHW";    err:='can''t lock hardware'
  182.     CASE "MEM";    err:='not enough memory'
  183.     CASE "ZBU";    err:='unable to build z-buffer: '
  184.         SELECT exceptioninfo
  185.         CASE W3D_NOGFXMEM;    err2:='no video memory'
  186.         CASE W3D_NOZBUFFER;    err2:='z-bufering not supported'
  187.         ENDSELECT
  188.     DEFAULT;        err:='   ';    StrCopy(err,[exception<<8]:L,3)
  189.     ENDSELECT
  190.     IF exception THEN PrintF('\s\s\n',err,err2)
  191. ENDPROC
  192.  
  193. PROC OpenAll()
  194.     IFN CyberGfxBase:=OpenLibrary('cybergraphics.library',0) THEN Raise("CGX")
  195.     IFN Warp3DBase:=OpenLibrary('Warp3D.library',0) THEN Raise("W3D")
  196.  
  197.     DEF    flags=W3D_CheckDriver()
  198.     IFN flags&W3D_DRIVER_3DHW||flags&W3D_DRIVER_CPU THEN Raise("DRV")
  199.  
  200.     DEF    format=W3D_GetDestFmt()
  201.     IFN format&W3D_FMT_R5G5B5 THEN Raise("N15")
  202.  
  203.     DEF    modeid
  204.     IF (modeid:=CModeRequestTags(NIL,
  205.         CYBRMREQ_MinDepth,15,
  206.         CYBRMREQ_MaxDepth,15,
  207.         TAG_END))=INVALID_ID THEN Raise("MID")
  208.  
  209.     IF IsCyberModeID(modeid)
  210.         width:=GetCyberIDAttr(CYBRIDATTR_Width,modeid)
  211.         height:=GetCyberIDAttr(CYBRIDATTR_Height,modeid)
  212.     ELSE Raise("MID")
  213.  
  214.     IFN screen:=OpenScreenTags(NIL,
  215.         SA_Width,width,
  216.         SA_Height,height,
  217.         SA_DisplayID,modeid,
  218.         SA_ShowTitle,FALSE,
  219.         SA_Draggable,FALSE,
  220.         TAG_END) THEN Raise("SCR")
  221.  
  222.     // prepare double buffering
  223.     IFN buf1:=AllocScreenBuffer(screen,NIL,SB_SCREEN_BITMAP) THEN Raise("SCB")
  224.     IFN GetCyberMapAttr(buf1.BitMap,CYBRMATTR_IsCyberGfx) THEN Raise("CGB",1)
  225.     IFN buf2:=AllocScreenBuffer(screen,NIL,0) THEN Raise("SCB")
  226.     IFN GetCyberMapAttr(buf2.BitMap,CYBRMATTR_IsCyberGfx) THEN Raise("CGB",2)
  227.     buf1.DBufInfo.SafeMessage.ReplyPort:=NIL
  228.     WHILEN ChangeScreenBuffer(screen,buf1);    ENDWHILE
  229.     WaitTOF()
  230.     bm:=buf1.BitMap
  231.     bufnum:=0
  232.  
  233.     IFN window:=OpenWindowTags(NIL,
  234.         WA_CustomScreen,screen,
  235.         WA_Width,screen.Width,
  236.         WA_Height,screen.Height,
  237.         WA_Left,0,
  238.         WA_Top,0,
  239.         WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_VANILLAKEY|IDCMP_MOUSEMOVE,
  240.         WA_Flags,WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_ACTIVATE|WFLG_REPORTMOUSE,
  241.         TAG_END) THEN Raise("WIN")
  242.  
  243.     DEF    cerr
  244.     IFN context:=W3D_CreateContextTags(&cerr,
  245.         W3D_CC_MODEID,modeid,
  246.         W3D_CC_DRIVERTYPE,W3D_DRIVER_BEST,
  247.         W3D_CC_BITMAP,bm,
  248.         W3D_CC_YOFFSET,0,
  249.         TAG_END) THEN Raise("CTX",cerr)
  250.     IFN W3D_SUCCESS=(cerr:=W3D_AllocZBuffer(context)) THEN Raise("ZBU",cerr)
  251.     W3D_SetState(context,W3D_GOURAUD,W3D_ENABLE)
  252.     W3D_SetState(context,W3D_ZBUFFER,W3D_ENABLE)
  253.     W3D_SetZCompareMode(context,W3D_Z_GREATER)
  254.  
  255.     scissor:=[0,0,width,height]:W3D_Scissor
  256.     SwitchBuffers()
  257. ENDPROC
  258.  
  259. PROC CloseAll()
  260.     W3D_FreeZBuffer(context)
  261.     IF context THEN W3D_DestroyContext(context)
  262.     IF window THEN CloseWindow(window)
  263.     IF buf2 THEN FreeScreenBuffer(screen,buf2)
  264.     IF buf1 THEN FreeScreenBuffer(screen,buf1)
  265.     IF screen THEN CloseScreen(screen)
  266.     IF Warp3DBase THEN CloseLibrary(Warp3DBase)
  267.     IF CyberGfxBase THEN CloseLibrary(CyberGfxBase)
  268. ENDPROC
  269.